﻿#region Copyright (c) Koolwired Solutions, LLC.
/*--------------------------------------------------------------------------
 * Copyright (c) 2009, Koolwired Solutions, LLC.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer. 
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution. 
 * Neither the name of Koolwired Solutions, LLC. nor the names of its
 * contributors may be used to endorse or promote products derived from
 * this software without specific prior written permission. 
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
 * AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A 
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
 * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
 * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *--------------------------------------------------------------------------*/
#endregion

#region History
/*--------------------------------------------------------------------------
 * Modification History: 
 * Date       Programmer      		Description
 * 12/18/09   Keith Kikta     		Inital release.
 *--------------------------------------------------------------------------*/
#endregion

#region References
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
#endregion

namespace Koolwired.Imap.DiagnosticTool
{
    #region Header
    /// <summary>
    /// Represents the IMAP Server Diagnostic Tool
    /// </summary>
    #endregion
    public partial class Form1 : Form
    {
        #region Private Variables
        ConnectionProperties connprop = new ConnectionProperties();
        ImapConnect connection;
        ImapAuthenticate authentication;
        #endregion

        #region Constructor
        /// <summary>
        /// Initalize the server diagnostic tool.
        /// </summary>
        public Form1()
        {
            InitializeComponent();
            LoadSettings();
        }
        #endregion

        #region Private Methods
        /// <summary>
        /// Allow the user to set the default connection properties for the IMAP connection.
        /// </summary>
        /// <param name="sender">An object representing the calling control.</param>
        /// <param name="e">A EventArgs object.</param>
        void toolStripButton2_Click(object sender, EventArgs e)
        {
            connprop.ShowDialog();
            LoadSettings();
        }
        /// <summary>
        /// Load connection properties from user settings 
        /// </summary>
        void LoadSettings()
        {
            lblHost.Text = connprop.Host;
            lblUser.Text = connprop.User;
            lblPort.Text = connprop.Port.ToString();
            lblSSL.Text = (connprop.IsSSL) ? "Enabled" : "Disabled";
        }
        /// <summary>
        /// Toggle connection/disconnect.
        /// </summary>
        /// <param name="sender">An object representing the calling control.</param>
        /// <param name="e">A EventArgs object.</param>
        void btnConnect_Click(object sender, EventArgs e)
        {
            // If the connection is defined and open then disconnect
            if (connection != null && connection.ConnectionState == ConnectionState.Open)
            {
                authentication.Logout();
                connection.Close();
                ConnectStatus.Text = "Disconnected";
                btnConnect.Image = Icons.connect;
            }
            else // Otherwise start the connection
            {
                try
                {
                    connection = new ImapConnect(lblHost.Text, int.Parse(lblPort.Text), (lblSSL.Text == "Enabled"));
                    connection.Output = textBox1;
                    authentication = new ImapAuthenticate(connection, lblUser.Text, txtPass.Text);
                    connection.Open();
                    authentication.Login();
                    ConnectStatus.Text = "Connected";
                    btnConnect.Image = Icons.disconnect;
                }
                catch (Exception)
                {
                    connection.Close();
                    ConnectStatus.Text = "Disconnected";
                    btnConnect.Image = Icons.connect;
               }
            }
        }
        void btnCommand_Click(object sender, EventArgs e)
        {
            // Send the command to the server.
            connection.Write(string.Format("{0}\r\n", txtCommand.Text));
            string response = string.Empty;
            do
            {
                response = connection.Read();
                // If the response ends with {##} where # represents a number keep reading.
                while (System.Text.RegularExpressions.Regex.IsMatch(response, @"{\d+}$"))
                    response += connection.Read();
                textBox2.AppendText(response + Environment.NewLine);
            } while (!System.Text.RegularExpressions.Regex.IsMatch(response, ImapRegularExpressions.PARSE_TAG));
        }
        #endregion

        void txtPass_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
                btnConnect_Click(sender, e);
        }
        void txtCommand_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
           if (e.KeyChar == Convert.ToChar(Keys.Enter))
                btnCommand_Click(sender, e);
        }

    }
}
